package org.example.dynamic_planning;

import java.util.Arrays;

public class The_weight_of_the_last_stone_II {
    public static void main(String[] args) {
        //最后一块石头的重量 II

        //有一堆石头，用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。
        //每一回合，从中选出任意两块石头，然后将它们一起粉碎。假设石头的重量分别为 x 和 y，且 x <= y。那么粉碎的可能结果如下：
        //如果 x == y，那么两块石头都会被完全粉碎；
        //如果 x != y，那么重量为 x 的石头将会完全粉碎，而重量为 y 的石头新重量为 y-x。
        //最后，最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下，就返回 0
        int[] stones = {40,31,26,33,21};
        int i = lastStoneWeightII(stones);
        System.out.println(i);
    }
    public static int lastStoneWeightII(int[] stones) {
        int sum = 0;
        for (int i = 0; i < stones.length; i++) {
            sum+=stones[i];
        }
        int[][] dp = new int[stones.length][sum / 2 + 1];

        for (int[] arr : dp) {
            Arrays.fill(arr,0);
        }
        for (int i = stones[0]; i < sum / 2 + 1; i++) {
            dp[0][i] = stones[0];
        }
        for (int i = 1; i < stones.length; i++) {
            for (int j = 1; j < sum / 2 + 1; j++) {
                if (stones[i] > j){
                    dp[i][j] = dp[i-1][j];
                }else{
                    dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j-stones[i]]+stones[i]);
                }
            }
        }

        return  Math.abs(dp[stones.length-1][sum/2] - (sum - dp[stones.length-1][sum/2]));
    }
}
